<?php
require_once "authcode.php";
session_start();
class Captcha{
    /* *
     * 输出验证码并把验证码的值保存的session中
     */
    public function entry(){
        $image = imagecreatetruecolor(100, 30);
        //将背景设置为白色的
        $bgcolor = imagecolorallocate($image, 255, 255, 255);
        //将白色铺满地图
        imagefill($image, 0, 0, $bgcolor);

        //计算结果
        $captch_code='';

        //随机等式
        for ($i=0; $i < 4; $i++) {
            if(in_array($i,[0,2])){
                //产生随机数字0-99
                $fontcontent[] = rand(1,99);
            }
            if($i == 1){
                $operator='+-*';//除号显示有问题
                $fontcontent[] = $operator[rand(0,2)];
            }
            if($i == 3){
                $fontcontent[] = '=';
            }
        }

        switch ($fontcontent[1]){
            case '+':
                $captch_code = $fontcontent[0] + $fontcontent[2];
                break;
            case '-':
                $captch_code = abs($fontcontent[0] - $fontcontent[2]);//获取绝对值
                //若减数小于被减数，对换值
                if($fontcontent[0] < $fontcontent[2]){
                    $flag=$fontcontent[2];
                    $fontcontent[2]=$fontcontent[0];
                    $fontcontent[0] = $flag;
                }
                break;
            case '*':
                if($fontcontent[0]>10 && $fontcontent[2] > 10){
                    $fontcontent[0]=rand(1,10);
                }
                $captch_code = $fontcontent[0] * $fontcontent[2];
                break;
            case '/':
                //若除数小于被除数，对换值
                if($fontcontent[0] < $fontcontent[2]){
                    $flag=$fontcontent[2];
                    $fontcontent[2]=$fontcontent[0];
                    $fontcontent[0] = $flag;
                }
                //求余 若有余数，除数减去余数
                $remainder=$fontcontent[0]%$fontcontent[2];
                if($remainder > 0){
                    $fontcontent[0]=$fontcontent[0]-$remainder;
                }
                $captch_code = $fontcontent[0] / $fontcontent[2];
                break;
        }
        //echo '<pre>';print_r($fontcontent);die;
        foreach ($fontcontent as $k=>$v){
            $fontsize=6;
            $fontcolor=imagecolorallocate($image,rand(0,120),rand(0,120),rand(0,120));
            //数字的位置，0，0是左上角。不能重合显示不完全
            $x=($k*100/4)+rand(5,10);
            $y=rand(5,10);
            imagestring($image,$fontsize,$x,$y,$v,$fontcolor);
        }


        $_SESSION['authcode'] = self::authcode($captch_code);//保存验证码的结果
        //为验证码增加干扰元素，控制好颜色，
        //点
        //影响等式的展示
//        for ($i=0; $i < 200; $i++) {
//            $pointcolor = imagecolorallocate($image,rand(100,150),rand(100,150),rand(100,150));
//            imagesetpixel($image, rand(1,99), rand(1,29), $pointcolor);
//        }

        //为验证码增加干扰元素
        //线
//        for ($i=0; $i < 3; $i++) {
//            $linecolor = imagecolorallocate($image,rand(80,220),rand(80,220),rand(80,220));
//            imageline($image, rand(1,99), rand(1,29),rand(1,99), rand(1,29) ,$linecolor);
//        }

        header('content-type:image/png');
        imagepng($image);

        //销毁
        imagedestroy($image);
    }

    /*
     * 验证码加解密
     * $str 需要加解密的字符串
     * $state 加解密状态  E 加密  D 解密
     * $expiry 加密字符串有效时长  0为永久有效
     * $len 随机字符串  取值 0-32
     * return 成功返回字符串  失败返回false
     * */
    public function authcode($str,$state='E',$expiry=90,$len=6){
        $authcode=new authcode($len,$expiry);
        $flag = $authcode->auth_code($str,$state);
        if($flag) return $flag;
        else return false;
    }

    /*
     * 验证验证码
     * */
    public function check($str){
        $old = $_SESSION['authcode'];
        $flag=self::authcode($old,'D');
        if(!$flag) return ['code'=>404,'msg'=>'验证码过期或错误'];
        if($flag != $str) return ['code'=>404,'msg'=>'验证码错误'];
        else return ['code'=>200,'msg'=>'成功'];
    }
}
